/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2025-04-24 22:04:42
 * @LastEditTime : 2025-07-31 00:08:10
 * @FilePath     : \ZN-1000-APP\hal_driver\ll_exti.c
 * @Description  : 外部中断低层驱动
 * @Version      : V1.0
 * @History      :
 * @Note         :
 */
/***************************************Includes***********************************/
#include "ll_exti.h"
#include "os_config.h"

#if defined(GD32F407)
#include "gd32f4xx.h"
#elif defined(STM32F40_41xxx)
#include "stm32f4xx.h"
#elif defined(GD32F10X_HD)
#include "gd32f10x.h"
#elif defined(STM32F10X_HD)
#include "stm32f10x.h"
#elif defined(PY32F071xB)
#include "py32f0xx.h"
#else
#error "No device selected"
#endif

/************************************Private Macros********************************/
// #define


/**********************************Private Statement*******************************/


/***********************************Public Variables*******************************/



/**********************************Private Variables*******************************/

static exti_ll_t *exti_handle[16];


/**********************************Public Functions********************************/

int exti_ll_init(exti_ll_t *elt, exti_ll_config_t *cfg, exti_ll_interrupt_cb_t cb, void *arg) {
    elt->mode = cfg->mode;
    elt->trigger = cfg->trigger;
    elt->cfg_interrupt_priority = cfg->cfg_interrupt_priority;
    elt->arg = arg;
    elt->cb = cb;
    // clang-format off
#if defined(GD32F407) || defined(GD32F10X_HD)
    int ret = gpio_ll_init(&elt->gpio, cfg->port, cfg->pinnum, GPIO_LL_MODE_INPUT, GPIO_LL_OTYPE_OD, cfg->pull, cfg->speed, 0);
    if (ret < 0) {
        return -1;
    }
    #if defined(GD32F407)
        rcu_periph_clock_enable(RCU_SYSCFG);
        switch (cfg->pinnum) {
        case GPIO_PIN_0: nvic_irq_enable(EXTI0_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_1: nvic_irq_enable(EXTI1_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_2: nvic_irq_enable(EXTI2_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_3: nvic_irq_enable(EXTI3_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_4: nvic_irq_enable(EXTI4_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_5: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_6: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_7: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_8: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_9: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_10: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_11: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_12: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_13: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_14: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_15: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        default: return -1;
        }
        uint32_t exti_port, exti_pin, exti_line, exti_mode, exti_trigger;
        switch (cfg->port) {
        case GPIOA: exti_port = EXTI_SOURCE_GPIOA; break;
        case GPIOB: exti_port = EXTI_SOURCE_GPIOB; break;
        case GPIOC: exti_port = EXTI_SOURCE_GPIOC; break;
        case GPIOD: exti_port = EXTI_SOURCE_GPIOD; break;
        case GPIOE: exti_port = EXTI_SOURCE_GPIOE; break;
        case GPIOF: exti_port = EXTI_SOURCE_GPIOF; break;
        case GPIOG: exti_port = EXTI_SOURCE_GPIOG; break;
        case GPIOH: exti_port = EXTI_SOURCE_GPIOH; break;
        case GPIOI: exti_port = EXTI_SOURCE_GPIOI; break;
        default: return -1;
        }
        switch (cfg->pinnum) {
        case GPIO_PIN_0: exti_pin = EXTI_SOURCE_PIN0; exti_line = EXTI_0; exti_handle[0] = elt; break;
        case GPIO_PIN_1: exti_pin = EXTI_SOURCE_PIN1; exti_line = EXTI_1; exti_handle[1] = elt; break;
        case GPIO_PIN_2: exti_pin = EXTI_SOURCE_PIN2; exti_line = EXTI_2; exti_handle[2] = elt; break;
        case GPIO_PIN_3: exti_pin = EXTI_SOURCE_PIN3; exti_line = EXTI_3; exti_handle[3] = elt; break;
        case GPIO_PIN_4: exti_pin = EXTI_SOURCE_PIN4; exti_line = EXTI_4; exti_handle[4] = elt; break;
        case GPIO_PIN_5: exti_pin = EXTI_SOURCE_PIN5; exti_line = EXTI_5; exti_handle[5] = elt; break;
        case GPIO_PIN_6: exti_pin = EXTI_SOURCE_PIN6; exti_line = EXTI_6; exti_handle[6] = elt; break;
        case GPIO_PIN_7: exti_pin = EXTI_SOURCE_PIN7; exti_line = EXTI_7; exti_handle[7] = elt; break;
        case GPIO_PIN_8: exti_pin = EXTI_SOURCE_PIN8; exti_line = EXTI_8; exti_handle[8] = elt; break;
        case GPIO_PIN_9: exti_pin = EXTI_SOURCE_PIN9; exti_line = EXTI_9; exti_handle[9] = elt; break;
        case GPIO_PIN_10: exti_pin = EXTI_SOURCE_PIN10; exti_line = EXTI_10; exti_handle[10] = elt; break;
        case GPIO_PIN_11: exti_pin = EXTI_SOURCE_PIN11; exti_line = EXTI_11; exti_handle[11] = elt; break;
        case GPIO_PIN_12: exti_pin = EXTI_SOURCE_PIN12; exti_line = EXTI_12; exti_handle[12] = elt; break;
        case GPIO_PIN_13: exti_pin = EXTI_SOURCE_PIN13; exti_line = EXTI_13; exti_handle[13] = elt; break;
        case GPIO_PIN_14: exti_pin = EXTI_SOURCE_PIN14; exti_line = EXTI_14; exti_handle[14] = elt; break;
        case GPIO_PIN_15: exti_pin = EXTI_SOURCE_PIN15; exti_line = EXTI_15; exti_handle[15] = elt; break;
        default: return -1;
        }
        switch (cfg->mode) {
        case EXTI_LL_MODE_INTERRUPT: exti_mode = EXTI_INTERRUPT; break;
        case EXTI_LL_MODE_EVENT: exti_mode = EXTI_EVENT; break; 
        default: return -1;
        }
        switch (cfg->trigger) {
        case EXTI_LL_TRIGGER_RISING: exti_trigger = EXTI_TRIG_RISING; break;
        case EXTI_LL_TRIGGER_FALLING: exti_trigger = EXTI_TRIG_FALLING; break;
        case EXTI_LL_TRIGGER_RISING_FALLING: exti_trigger = EXTI_TRIG_BOTH; break;
        default: return -1;
        }
        syscfg_exti_line_config(exti_port, exti_pin);
        exti_init(exti_line, exti_mode, exti_trigger);
        exti_interrupt_flag_clear(exti_line);
        return 0;
    #endif
    #if defined(GD32F10X_HD)
        rcu_periph_clock_enable(RCU_AF);
        switch (cfg->pinnum) {
        case GPIO_PIN_0: nvic_irq_enable(EXTI0_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_1: nvic_irq_enable(EXTI1_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_2: nvic_irq_enable(EXTI2_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_3: nvic_irq_enable(EXTI3_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_4: nvic_irq_enable(EXTI4_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_5: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_6: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_7: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_8: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_9: nvic_irq_enable(EXTI5_9_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_10: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_11: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_12: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_13: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_14: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        case GPIO_PIN_15: nvic_irq_enable(EXTI10_15_IRQn, cfg->cfg_interrupt_priority, 0); break;
        default: return -1;
        }
        uint32_t exti_port, exti_pin, exti_line, exti_mode, exti_trigger;
        switch (cfg->port) {
        case GPIOA: exti_port = GPIO_PORT_SOURCE_GPIOA; break;
        case GPIOB: exti_port = GPIO_PORT_SOURCE_GPIOB; break;
        case GPIOC: exti_port = GPIO_PORT_SOURCE_GPIOC; break;
        case GPIOD: exti_port = GPIO_PORT_SOURCE_GPIOD; break;
        case GPIOE: exti_port = GPIO_PORT_SOURCE_GPIOE; break;
        case GPIOF: exti_port = GPIO_PORT_SOURCE_GPIOF; break;
        case GPIOG: exti_port = GPIO_PORT_SOURCE_GPIOG; break;
        default: return -1;
        }
        switch (cfg->pinnum) {
        case GPIO_PIN_0: exti_pin = GPIO_PIN_SOURCE_0; exti_line = EXTI_0; exti_handle[0] = elt; break;
        case GPIO_PIN_1: exti_pin = GPIO_PIN_SOURCE_1; exti_line = EXTI_1; exti_handle[1] = elt; break;
        case GPIO_PIN_2: exti_pin = GPIO_PIN_SOURCE_2; exti_line = EXTI_2; exti_handle[2] = elt; break;
        case GPIO_PIN_3: exti_pin = GPIO_PIN_SOURCE_3; exti_line = EXTI_3; exti_handle[3] = elt; break;
        case GPIO_PIN_4: exti_pin = GPIO_PIN_SOURCE_4; exti_line = EXTI_4; exti_handle[4] = elt; break;
        case GPIO_PIN_5: exti_pin = GPIO_PIN_SOURCE_5; exti_line = EXTI_5; exti_handle[5] = elt; break;
        case GPIO_PIN_6: exti_pin = GPIO_PIN_SOURCE_6; exti_line = EXTI_6; exti_handle[6] = elt; break;
        case GPIO_PIN_7: exti_pin = GPIO_PIN_SOURCE_7; exti_line = EXTI_7; exti_handle[7] = elt; break;
        case GPIO_PIN_8: exti_pin = GPIO_PIN_SOURCE_8; exti_line = EXTI_8; exti_handle[8] = elt; break;
        case GPIO_PIN_9: exti_pin = GPIO_PIN_SOURCE_9; exti_line = EXTI_9; exti_handle[9] = elt; break;
        case GPIO_PIN_10: exti_pin = GPIO_PIN_SOURCE_10; exti_line = EXTI_10; exti_handle[10] = elt; break;
        case GPIO_PIN_11: exti_pin = GPIO_PIN_SOURCE_11; exti_line = EXTI_11; exti_handle[11] = elt; break;
        case GPIO_PIN_12: exti_pin = GPIO_PIN_SOURCE_12; exti_line = EXTI_12; exti_handle[12] = elt; break;
        case GPIO_PIN_13: exti_pin = GPIO_PIN_SOURCE_13; exti_line = EXTI_13; exti_handle[13] = elt; break;
        case GPIO_PIN_14: exti_pin = GPIO_PIN_SOURCE_14; exti_line = EXTI_14; exti_handle[14] = elt; break;
        case GPIO_PIN_15: exti_pin = GPIO_PIN_SOURCE_15; exti_line = EXTI_15; exti_handle[15] = elt; break;
        default: return -1;
        }
        switch (cfg->mode) {
        case EXTI_LL_MODE_INTERRUPT: exti_mode = EXTI_INTERRUPT; break;
        case EXTI_LL_MODE_EVENT: exti_mode = EXTI_EVENT; break; 
        default: return -1;
        }
        switch (cfg->trigger) {
        case EXTI_LL_TRIGGER_RISING: exti_trigger = EXTI_TRIG_RISING; break;
        case EXTI_LL_TRIGGER_FALLING: exti_trigger = EXTI_TRIG_FALLING; break;
        case EXTI_LL_TRIGGER_RISING_FALLING: exti_trigger = EXTI_TRIG_BOTH; break;
        default: return -1;
        }
        gpio_exti_source_select(exti_port, exti_pin);
        exti_init(exti_line, exti_mode, exti_trigger);
        exti_interrupt_flag_clear(exti_line);
        return 0;
    #endif
#elif defined(STM32F40_41xxx) || defined(STM32F10X_HD)
    int ret = gpio_ll_init(&elt->gpio, cfg->port, cfg->pinnum, GPIO_LL_MODE_INPUT, GPIO_LL_OTYPE_OD, cfg->pull, cfg->speed, 0);
    if (ret < 0) {
        return -1;
    }
    #if defined(STM32F40_41xxx)
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        uint32_t exti_port;
        uint32_t exti_source;
        EXTI_InitTypeDef exti_cfg;
        NVIC_InitTypeDef nvic_cfg;
        switch (cfg->port) {
        case (uint32_t)GPIOA: exti_port = EXTI_PortSourceGPIOA; break;
        case (uint32_t)GPIOB: exti_port = EXTI_PortSourceGPIOB; break;
        case (uint32_t)GPIOC: exti_port = EXTI_PortSourceGPIOC; break;
        case (uint32_t)GPIOD: exti_port = EXTI_PortSourceGPIOD; break;
        case (uint32_t)GPIOE: exti_port = EXTI_PortSourceGPIOE; break;
        case (uint32_t)GPIOF: exti_port = EXTI_PortSourceGPIOF; break;
        case (uint32_t)GPIOG: exti_port = EXTI_PortSourceGPIOG; break;
        case (uint32_t)GPIOH: exti_port = EXTI_PortSourceGPIOH; break;
        case (uint32_t)GPIOI: exti_port = EXTI_PortSourceGPIOI; break;
        case (uint32_t)GPIOJ: exti_port = EXTI_PortSourceGPIOJ; break;
        case (uint32_t)GPIOK: exti_port = EXTI_PortSourceGPIOK; break;
        default: return -1;
        }
        switch (cfg->pinnum) {
        case GPIO_Pin_0: exti_source = EXTI_PinSource0; exti_cfg.EXTI_Line = EXTI_Line0; break;
        case GPIO_Pin_1: exti_source = EXTI_PinSource1; exti_cfg.EXTI_Line = EXTI_Line1; break;
        case GPIO_Pin_2: exti_source = EXTI_PinSource2; exti_cfg.EXTI_Line = EXTI_Line2; break;
        case GPIO_Pin_3: exti_source = EXTI_PinSource3; exti_cfg.EXTI_Line = EXTI_Line3; break;
        case GPIO_Pin_4: exti_source = EXTI_PinSource4; exti_cfg.EXTI_Line = EXTI_Line4; break;
        case GPIO_Pin_5: exti_source = EXTI_PinSource5; exti_cfg.EXTI_Line = EXTI_Line5; break;
        case GPIO_Pin_6: exti_source = EXTI_PinSource6; exti_cfg.EXTI_Line = EXTI_Line6; break;
        case GPIO_Pin_7: exti_source = EXTI_PinSource7; exti_cfg.EXTI_Line = EXTI_Line7; break;
        case GPIO_Pin_8: exti_source = EXTI_PinSource8; exti_cfg.EXTI_Line = EXTI_Line8; break;
        case GPIO_Pin_9: exti_source = EXTI_PinSource9; exti_cfg.EXTI_Line = EXTI_Line9; break;
        case GPIO_Pin_10: exti_source = EXTI_PinSource10; exti_cfg.EXTI_Line = EXTI_Line10; break;
        case GPIO_Pin_11: exti_source = EXTI_PinSource11; exti_cfg.EXTI_Line = EXTI_Line11; break;
        case GPIO_Pin_12: exti_source = EXTI_PinSource12; exti_cfg.EXTI_Line = EXTI_Line12; break;
        case GPIO_Pin_13: exti_source = EXTI_PinSource13; exti_cfg.EXTI_Line = EXTI_Line13; break;
        case GPIO_Pin_14: exti_source = EXTI_PinSource14; exti_cfg.EXTI_Line = EXTI_Line14; break;
        case GPIO_Pin_15: exti_source = EXTI_PinSource15; exti_cfg.EXTI_Line = EXTI_Line15; break;
        default: return -1;
        }
        SYSCFG_EXTILineConfig(exti_port, exti_source);
        switch (cfg->mode) {
        case EXTI_LL_MODE_INTERRUPT: exti_cfg.EXTI_Mode = EXTI_Mode_Interrupt; break;
        case EXTI_LL_MODE_EVENT: exti_cfg.EXTI_Mode = EXTI_Mode_Event; break;
        default: return -1;
        }
        switch (cfg->trigger) {
        case EXTI_LL_TRIGGER_RISING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Rising; break;
        case EXTI_LL_TRIGGER_FALLING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Falling; break;
        case EXTI_LL_TRIGGER_RISING_FALLING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Rising_Falling; break;
        default: return -1;
        }
        exti_cfg.EXTI_LineCmd = ENABLE;
        EXTI_Init(&exti_cfg);

        switch (cfg->pinnum) {
        case GPIO_Pin_0: nvic_cfg.NVIC_IRQChannel = EXTI0_IRQn; exti_handle[0] = elt; break;
        case GPIO_Pin_1: nvic_cfg.NVIC_IRQChannel = EXTI1_IRQn; exti_handle[1] = elt; break;
        case GPIO_Pin_2: nvic_cfg.NVIC_IRQChannel = EXTI2_IRQn; exti_handle[2] = elt; break;
        case GPIO_Pin_3: nvic_cfg.NVIC_IRQChannel = EXTI3_IRQn; exti_handle[3] = elt; break;
        case GPIO_Pin_4: nvic_cfg.NVIC_IRQChannel = EXTI4_IRQn; exti_handle[4] = elt; break;
        case GPIO_Pin_5: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[5] = elt; break;
        case GPIO_Pin_6: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[6] = elt; break;
        case GPIO_Pin_7: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[7] = elt; break;
        case GPIO_Pin_8: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[8] = elt; break;
        case GPIO_Pin_9: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[9] = elt; break;
        case GPIO_Pin_10: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[10] = elt; break;
        case GPIO_Pin_11: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[11] = elt; break;
        case GPIO_Pin_12: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[12] = elt; break;
        case GPIO_Pin_13: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[13] = elt; break;
        case GPIO_Pin_14: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[14] = elt; break;
        case GPIO_Pin_15: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[15] = elt; break;
        default: return -1;
        }
        nvic_cfg.NVIC_IRQChannelPreemptionPriority = cfg->cfg_interrupt_priority;
        nvic_cfg.NVIC_IRQChannelSubPriority = 0;
        nvic_cfg.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&nvic_cfg);
        return 0;
    #endif

    #if defined(STM32F10X_HD)
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        uint32_t exti_port;
        uint32_t exti_source;
        EXTI_InitTypeDef exti_cfg;
        NVIC_InitTypeDef nvic_cfg;
        switch (cfg->port) {
        case (uint32_t)GPIOA: exti_port = GPIO_PortSourceGPIOA; break;
        case (uint32_t)GPIOB: exti_port = GPIO_PortSourceGPIOB; break;
        case (uint32_t)GPIOC: exti_port = GPIO_PortSourceGPIOC; break;
        case (uint32_t)GPIOD: exti_port = GPIO_PortSourceGPIOD; break;
        case (uint32_t)GPIOE: exti_port = GPIO_PortSourceGPIOE; break;
        case (uint32_t)GPIOF: exti_port = GPIO_PortSourceGPIOF; break;
        case (uint32_t)GPIOG: exti_port = GPIO_PortSourceGPIOG; break;
        default: return -1;
        }
        switch (cfg->pinnum) {
        case GPIO_Pin_0: exti_source = GPIO_PinSource0; exti_cfg.EXTI_Line = EXTI_Line0; break;
        case GPIO_Pin_1: exti_source = GPIO_PinSource1; exti_cfg.EXTI_Line = EXTI_Line1; break;
        case GPIO_Pin_2: exti_source = GPIO_PinSource2; exti_cfg.EXTI_Line = EXTI_Line2; break;
        case GPIO_Pin_3: exti_source = GPIO_PinSource3; exti_cfg.EXTI_Line = EXTI_Line3; break;
        case GPIO_Pin_4: exti_source = GPIO_PinSource4; exti_cfg.EXTI_Line = EXTI_Line4; break;
        case GPIO_Pin_5: exti_source = GPIO_PinSource5; exti_cfg.EXTI_Line = EXTI_Line5; break;
        case GPIO_Pin_6: exti_source = GPIO_PinSource6; exti_cfg.EXTI_Line = EXTI_Line6; break;
        case GPIO_Pin_7: exti_source = GPIO_PinSource7; exti_cfg.EXTI_Line = EXTI_Line7; break;
        case GPIO_Pin_8: exti_source = GPIO_PinSource8; exti_cfg.EXTI_Line = EXTI_Line8; break;
        case GPIO_Pin_9: exti_source = GPIO_PinSource9; exti_cfg.EXTI_Line = EXTI_Line9; break;
        case GPIO_Pin_10: exti_source = GPIO_PinSource10; exti_cfg.EXTI_Line = EXTI_Line10; break;
        case GPIO_Pin_11: exti_source = GPIO_PinSource11; exti_cfg.EXTI_Line = EXTI_Line11; break;
        case GPIO_Pin_12: exti_source = GPIO_PinSource12; exti_cfg.EXTI_Line = EXTI_Line12; break;
        case GPIO_Pin_13: exti_source = GPIO_PinSource13; exti_cfg.EXTI_Line = EXTI_Line13; break;
        case GPIO_Pin_14: exti_source = GPIO_PinSource14; exti_cfg.EXTI_Line = EXTI_Line14; break;
        case GPIO_Pin_15: exti_source = GPIO_PinSource15; exti_cfg.EXTI_Line = EXTI_Line15; break;
        default: return -1;
        }
        GPIO_EXTILineConfig(exti_port, exti_source);
        switch (cfg->mode) {
        case EXTI_LL_MODE_INTERRUPT: exti_cfg.EXTI_Mode = EXTI_Mode_Interrupt; break;
        case EXTI_LL_MODE_EVENT: exti_cfg.EXTI_Mode = EXTI_Mode_Event; break;
        default: return -1;
        }
        switch (cfg->trigger) {
        case EXTI_LL_TRIGGER_RISING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Rising; break;
        case EXTI_LL_TRIGGER_FALLING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Falling; break;
        case EXTI_LL_TRIGGER_RISING_FALLING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Rising_Falling; break;
        default: return -1;
        }
        exti_cfg.EXTI_LineCmd = ENABLE;
        EXTI_Init(&exti_cfg);

        switch (cfg->pinnum) {
        case GPIO_Pin_0: nvic_cfg.NVIC_IRQChannel = EXTI0_IRQn; exti_handle[0] = elt; break;
        case GPIO_Pin_1: nvic_cfg.NVIC_IRQChannel = EXTI1_IRQn; exti_handle[1] = elt; break;
        case GPIO_Pin_2: nvic_cfg.NVIC_IRQChannel = EXTI2_IRQn; exti_handle[2] = elt; break;
        case GPIO_Pin_3: nvic_cfg.NVIC_IRQChannel = EXTI3_IRQn; exti_handle[3] = elt; break;
        case GPIO_Pin_4: nvic_cfg.NVIC_IRQChannel = EXTI4_IRQn; exti_handle[4] = elt; break;
        case GPIO_Pin_5: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[5] = elt; break;
        case GPIO_Pin_6: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[6] = elt; break;
        case GPIO_Pin_7: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[7] = elt; break;
        case GPIO_Pin_8: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[8] = elt; break;
        case GPIO_Pin_9: nvic_cfg.NVIC_IRQChannel = EXTI9_5_IRQn; exti_handle[9] = elt; break;
        case GPIO_Pin_10: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[10] = elt; break;
        case GPIO_Pin_11: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[11] = elt; break;
        case GPIO_Pin_12: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[12] = elt; break;
        case GPIO_Pin_13: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[13] = elt; break;
        case GPIO_Pin_14: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[14] = elt; break;
        case GPIO_Pin_15: nvic_cfg.NVIC_IRQChannel = EXTI15_10_IRQn; exti_handle[15] = elt; break;
        default: return -1;
        }
        nvic_cfg.NVIC_IRQChannelPreemptionPriority = cfg->cfg_interrupt_priority;
        nvic_cfg.NVIC_IRQChannelSubPriority = 0;
        nvic_cfg.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&nvic_cfg);
        return 0;
    #endif
#elif defined(PY32F071xB)
    elt->gpio.port = cfg->port;
    elt->gpio.pin = cfg->pinnum;
    GPIO_InitTypeDef gpio_cfg;
    switch (elt->gpio.port) {
    case (uint32_t)GPIOA: __HAL_RCC_GPIOA_CLK_ENABLE(); break;
    case (uint32_t)GPIOB: __HAL_RCC_GPIOB_CLK_ENABLE(); break;
    case (uint32_t)GPIOC: __HAL_RCC_GPIOC_CLK_ENABLE(); break;
    case (uint32_t)GPIOF: __HAL_RCC_GPIOF_CLK_ENABLE(); break;
    default: return -1;
    }
    switch (cfg->trigger) {
    case EXTI_LL_TRIGGER_RISING: gpio_cfg.Mode = cfg->mode == EXTI_LL_MODE_INTERRUPT ? GPIO_MODE_IT_RISING : GPIO_MODE_EVT_RISING; break;
    case EXTI_LL_TRIGGER_FALLING: gpio_cfg.Mode = cfg->mode == EXTI_LL_MODE_INTERRUPT ? GPIO_MODE_IT_FALLING : GPIO_MODE_EVT_FALLING; break;
    case EXTI_LL_TRIGGER_RISING_FALLING: gpio_cfg.Mode = cfg->mode == EXTI_LL_MODE_INTERRUPT ? GPIO_MODE_IT_RISING_FALLING : GPIO_MODE_EVT_RISING_FALLING; break;
    default: return -1;
    }
    switch (cfg->pull) {
    case GPIO_LL_PULL_NO: gpio_cfg.Pull = GPIO_NOPULL; break;
    case GPIO_LL_PULL_UP: gpio_cfg.Pull = GPIO_PULLUP; break;
    case GPIO_LL_PULL_DOWN: gpio_cfg.Pull = GPIO_PULLDOWN; break;
    default: return -1;
    }
    switch (cfg->speed) {
    case GPIO_LL_SPEED_LOW: gpio_cfg.Speed = GPIO_SPEED_FREQ_LOW; break;
    case GPIO_LL_SPEED_MEDIUM: gpio_cfg.Speed = GPIO_SPEED_FREQ_MEDIUM; break;
    case GPIO_LL_SPEED_HIGH: gpio_cfg.Speed = GPIO_SPEED_FREQ_HIGH; break;
    case GPIO_LL_SPEED_VERY_HIGH: gpio_cfg.Speed = GPIO_SPEED_FREQ_VERY_HIGH; break;
    default: return -1;
    }
    gpio_cfg.Pin = cfg->pinnum;
    elt->gpio.mode = gpio_cfg.Mode;
    elt->gpio.pull = gpio_cfg.Pull;
    elt->gpio.speed = gpio_cfg.Speed;
    elt->gpio.af_num = 0;
    HAL_GPIO_Init((void *)(elt->gpio.port), &gpio_cfg);
    switch (elt->gpio.pin) {
    case GPIO_PIN_0: exti_handle[0] = elt; break;
    case GPIO_PIN_1: exti_handle[1] = elt; break;
    case GPIO_PIN_2: exti_handle[2] = elt; break;
    case GPIO_PIN_3: exti_handle[3] = elt; break;
    case GPIO_PIN_4: exti_handle[4] = elt; break;
    case GPIO_PIN_5: exti_handle[5] = elt; break;
    case GPIO_PIN_6: exti_handle[6] = elt; break;
    case GPIO_PIN_7: exti_handle[7] = elt; break;
    case GPIO_PIN_8: exti_handle[8] = elt; break;
    case GPIO_PIN_9: exti_handle[9] = elt; break;
    case GPIO_PIN_10: exti_handle[10] = elt; break;
    case GPIO_PIN_11: exti_handle[11] = elt; break;
    case GPIO_PIN_12: exti_handle[12] = elt; break;
    case GPIO_PIN_13: exti_handle[13] = elt; break;
    case GPIO_PIN_14: exti_handle[14] = elt; break;
    case GPIO_PIN_15: exti_handle[15] = elt; break;
    default: return -1;
    }
    switch (elt->gpio.pin) {
    case GPIO_PIN_0: 
    case GPIO_PIN_1: NVIC_SetPriority(EXTI0_1_IRQn, elt->cfg_interrupt_priority); NVIC_EnableIRQ(EXTI0_1_IRQn); break;
    case GPIO_PIN_2:
    case GPIO_PIN_3: NVIC_SetPriority(EXTI2_3_IRQn, elt->cfg_interrupt_priority); NVIC_EnableIRQ(EXTI2_3_IRQn); break;
    case GPIO_PIN_4:
    case GPIO_PIN_5:
    case GPIO_PIN_6:
    case GPIO_PIN_7:
    case GPIO_PIN_8:
    case GPIO_PIN_9:
    case GPIO_PIN_10:
    case GPIO_PIN_11:
    case GPIO_PIN_12:
    case GPIO_PIN_13:
    case GPIO_PIN_14:
    case GPIO_PIN_15: NVIC_SetPriority(EXTI4_15_IRQn, elt->cfg_interrupt_priority); NVIC_EnableIRQ(EXTI4_15_IRQn); break;
    default: return -1;
    }
    return 0;
#endif
    return -1;
    // clang-format on
}
/**
 * @brief 反初始化exti
 * @param  elt
 * @return int 0成功 -1失败
 * @note null
 */
int exti_ll_deinit(exti_ll_t *elt) {
#if defined(PY32F071xB)
    HAL_GPIO_DeInit((void *)(elt->gpio.port), elt->gpio.pin);
#endif
    switch (elt->gpio.pin) {
    case GPIO_PIN_0: exti_handle[0] = 0; break;
    case GPIO_PIN_1: exti_handle[1] = 0; break;
    case GPIO_PIN_2: exti_handle[2] = 0; break;
    case GPIO_PIN_3: exti_handle[3] = 0; break;
    case GPIO_PIN_4: exti_handle[4] = 0; break;
    case GPIO_PIN_5: exti_handle[5] = 0; break;
    case GPIO_PIN_6: exti_handle[6] = 0; break;
    case GPIO_PIN_7: exti_handle[7] = 0; break;
    case GPIO_PIN_8: exti_handle[8] = 0; break;
    case GPIO_PIN_9: exti_handle[9] = 0; break;
    case GPIO_PIN_10: exti_handle[10] = 0; break;
    case GPIO_PIN_11: exti_handle[11] = 0; break;
    case GPIO_PIN_12: exti_handle[12] = 0; break;
    case GPIO_PIN_13: exti_handle[13] = 0; break;
    case GPIO_PIN_14: exti_handle[14] = 0; break;
    case GPIO_PIN_15: exti_handle[15] = 0; break;
    default: return -1;
    }
    return -1;
}
/**********************************Private Functions*******************************/
// clang-format off
#if HAL_LL_EXTI
// 中断服务
#if defined(GD32F407) || defined(GD32F10X_HD)
    #if defined(GD32F407) || defined(GD32F10X_HD)
        void EXTI0_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_0) != RESET) {
                exti_interrupt_flag_clear(EXTI_0);
                exti_handle[0]->state = gpio_ll_get_input(&exti_handle[0]->gpio);
                exti_handle[0]->cb(exti_handle[0]);
            }
        }
        void EXTI1_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_1) != RESET) {
                exti_interrupt_flag_clear(EXTI_1);
                exti_handle[1]->state = gpio_ll_get_input(&exti_handle[1]->gpio);
                exti_handle[1]->cb(exti_handle[1]);
            }
        }
        void EXTI2_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_2) != RESET) {
                exti_interrupt_flag_clear(EXTI_2);
                exti_handle[2]->state = gpio_ll_get_input(&exti_handle[2]->gpio);
                exti_handle[2]->cb(exti_handle[2]);
            }
        }
        void EXTI3_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_3) != RESET) {
                exti_interrupt_flag_clear(EXTI_3);
                exti_handle[3]->state = gpio_ll_get_input(&exti_handle[3]->gpio);
                exti_handle[3]->cb(exti_handle[3]);
            }
        }
        void EXTI4_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_4) != RESET) {
                exti_interrupt_flag_clear(EXTI_4);
                exti_handle[4]->state = gpio_ll_get_input(&exti_handle[4]->gpio);
                exti_handle[4]->cb(exti_handle[4]);
            }
        }
        void EXTI5_9_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_5) != RESET) {
                exti_interrupt_flag_clear(EXTI_5);
                exti_handle[5]->state = gpio_ll_get_input(&exti_handle[5]->gpio);
                exti_handle[5]->cb(exti_handle[5]);
            } else if (exti_interrupt_flag_get(EXTI_6) != RESET) {
                exti_interrupt_flag_clear(EXTI_6);
                exti_handle[6]->state = gpio_ll_get_input(&exti_handle[6]->gpio);
                exti_handle[6]->cb(exti_handle[6]);
            } else if (exti_interrupt_flag_get(EXTI_7) != RESET) {
                exti_interrupt_flag_clear(EXTI_7);
                exti_handle[7]->state = gpio_ll_get_input(&exti_handle[7]->gpio);
                exti_handle[7]->cb(exti_handle[7]);
            } else if (exti_interrupt_flag_get(EXTI_8) != RESET) {
                exti_interrupt_flag_clear(EXTI_8);
                exti_handle[8]->state = gpio_ll_get_input(&exti_handle[8]->gpio);
                exti_handle[8]->cb(exti_handle[8]);
            } else if (exti_interrupt_flag_get(EXTI_9) != RESET) {
                exti_interrupt_flag_clear(EXTI_9);
                exti_handle[9]->state = gpio_ll_get_input(&exti_handle[9]->gpio);
                exti_handle[9]->cb(exti_handle[9]);
            }
        }
        void EXTI10_15_IRQHandler(void) {
            if (exti_interrupt_flag_get(EXTI_10) != RESET) {
                exti_interrupt_flag_clear(EXTI_10);
                exti_handle[10]->state = gpio_ll_get_input(&exti_handle[10]->gpio);
                exti_handle[10]->cb(exti_handle[10]);
            } else if (exti_interrupt_flag_get(EXTI_11) != RESET) {
                exti_interrupt_flag_clear(EXTI_11);
                exti_handle[11]->state = gpio_ll_get_input(&exti_handle[11]->gpio);
                exti_handle[11]->cb(exti_handle[11]);
            } else if (exti_interrupt_flag_get(EXTI_12) != RESET) {
                exti_interrupt_flag_clear(EXTI_12);
                exti_handle[12]->state = gpio_ll_get_input(&exti_handle[12]->gpio);
                exti_handle[12]->cb(exti_handle[12]);
            } else if (exti_interrupt_flag_get(EXTI_13) != RESET) {
                exti_interrupt_flag_clear(EXTI_13);
                exti_handle[13]->state = gpio_ll_get_input(&exti_handle[13]->gpio);
                exti_handle[13]->cb(exti_handle[13]);
            } else if (exti_interrupt_flag_get(EXTI_14) != RESET) {
                exti_interrupt_flag_clear(EXTI_14);
                exti_handle[14]->state = gpio_ll_get_input(&exti_handle[14]->gpio);
                exti_handle[14]->cb(exti_handle[14]);
            } else if (exti_interrupt_flag_get(EXTI_15) != RESET) {
                exti_interrupt_flag_clear(EXTI_15);
                exti_handle[15]->state = gpio_ll_get_input(&exti_handle[15]->gpio);
                exti_handle[15]->cb(exti_handle[15]);
            }
        }
    #endif
#elif defined(STM32F40_41xxx) || defined(STM32F10X_HD)
    #if defined(STM32F40_41xxx) || defined(STM32F10X_HD)
        void EXTI0_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line0);
                exti_handle[0]->state = gpio_ll_get_input(&exti_handle[0]->gpio);
                exti_handle[0]->cb(exti_handle[0]);
            }
        }
        void EXTI1_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line1);
                exti_handle[1]->state = gpio_ll_get_input(&exti_handle[1]->gpio);
                exti_handle[1]->cb(exti_handle[1]);
            }
        }
        void EXTI2_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line2) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line2);
                exti_handle[2]->state = gpio_ll_get_input(&exti_handle[2]->gpio);
                exti_handle[2]->cb(exti_handle[2]);
            }
        }
        void EXTI3_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line3) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line3);
                exti_handle[3]->state = gpio_ll_get_input(&exti_handle[3]->gpio);
                exti_handle[3]->cb(exti_handle[3]);
            }
        }
        void EXTI4_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line4) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line4);
                exti_handle[4]->state = gpio_ll_get_input(&exti_handle[4]->gpio);
                exti_handle[4]->cb(exti_handle[4]);
            }
        }
        void EXTI9_5_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line5) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line5);
                exti_handle[5]->state = gpio_ll_get_input(&exti_handle[5]->gpio);
                exti_handle[5]->cb(exti_handle[5]);
            } else if (EXTI_GetITStatus(EXTI_Line6) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line6);
                exti_handle[6]->state = gpio_ll_get_input(&exti_handle[6]->gpio);
                exti_handle[6]->cb(exti_handle[6]);
            } else if (EXTI_GetITStatus(EXTI_Line7) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line7);
                exti_handle[7]->state = gpio_ll_get_input(&exti_handle[7]->gpio);
                exti_handle[7]->cb(exti_handle[7]);
            } else if (EXTI_GetITStatus(EXTI_Line8) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line8);
                exti_handle[8]->state = gpio_ll_get_input(&exti_handle[8]->gpio);
                exti_handle[8]->cb(exti_handle[8]);
            } else if (EXTI_GetITStatus(EXTI_Line9) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line9);
                exti_handle[9]->state = gpio_ll_get_input(&exti_handle[9]->gpio);
                exti_handle[9]->cb(exti_handle[9]);
            }
        }
        void EXTI15_10_IRQHandler(void) {
            if (EXTI_GetITStatus(EXTI_Line10) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line10);
                exti_handle[10]->state = gpio_ll_get_input(&exti_handle[10]->gpio);
                exti_handle[10]->cb(exti_handle[10]);
            } else if (EXTI_GetITStatus(EXTI_Line11) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line11);
                exti_handle[11]->state = gpio_ll_get_input(&exti_handle[11]->gpio);
                exti_handle[11]->cb(exti_handle[11]);
            } else if (EXTI_GetITStatus(EXTI_Line12) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line12);
                exti_handle[12]->state = gpio_ll_get_input(&exti_handle[12]->gpio);
                exti_handle[12]->cb(exti_handle[12]);
            } else if (EXTI_GetITStatus(EXTI_Line13) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line13);
                exti_handle[13]->state = gpio_ll_get_input(&exti_handle[13]->gpio);
                exti_handle[13]->cb(exti_handle[13]);
            } else if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line14);
                exti_handle[14]->state = gpio_ll_get_input(&exti_handle[14]->gpio);
                exti_handle[14]->cb(exti_handle[14]);
            } else if (EXTI_GetITStatus(EXTI_Line15) != RESET) {
                EXTI_ClearITPendingBit(EXTI_Line15);
                exti_handle[15]->state = gpio_ll_get_input(&exti_handle[15]->gpio);
                exti_handle[15]->cb(exti_handle[15]);
            }
        }
    #endif
#elif defined(PY32F071xB)
        void EXTI0_1_IRQHandler(void) {
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
                exti_handle[0]->state = gpio_ll_get_input(&exti_handle[0]->gpio);
                exti_handle[0]->cb(exti_handle[0]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
                exti_handle[1]->state = gpio_ll_get_input(&exti_handle[1]->gpio);
                exti_handle[1]->cb(exti_handle[1]);
            }
        }
        void EXTI2_3_IRQHandler(void) {
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_2) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
                exti_handle[2]->state = gpio_ll_get_input(&exti_handle[2]->gpio);
                exti_handle[2]->cb(exti_handle[2]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_3) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
                exti_handle[3]->state = gpio_ll_get_input(&exti_handle[3]->gpio);
                exti_handle[3]->cb(exti_handle[3]);
            }
        }
        void EXTI4_15_IRQHandler(void) {
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_4) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
                exti_handle[4]->state = gpio_ll_get_input(&exti_handle[4]->gpio);
                exti_handle[4]->cb(exti_handle[4]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
                exti_handle[5]->state = gpio_ll_get_input(&exti_handle[5]->gpio);
                exti_handle[5]->cb(exti_handle[5]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6);
                exti_handle[6]->state = gpio_ll_get_input(&exti_handle[6]->gpio);
                exti_handle[6]->cb(exti_handle[6]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_7) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
                exti_handle[7]->state = gpio_ll_get_input(&exti_handle[7]->gpio);
                exti_handle[7]->cb(exti_handle[7]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_8) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);
                exti_handle[8]->state = gpio_ll_get_input(&exti_handle[8]->gpio);
                exti_handle[8]->cb(exti_handle[8]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_9) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);
                exti_handle[9]->state = gpio_ll_get_input(&exti_handle[9]->gpio);
                exti_handle[9]->cb(exti_handle[9]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_10) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10);
                exti_handle[10]->state = gpio_ll_get_input(&exti_handle[10]->gpio);
                exti_handle[10]->cb(exti_handle[10]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_11) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_11);
                exti_handle[11]->state = gpio_ll_get_input(&exti_handle[11]->gpio);
                exti_handle[11]->cb(exti_handle[11]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_12) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_12);
                exti_handle[12]->state = gpio_ll_get_input(&exti_handle[12]->gpio);
                exti_handle[12]->cb(exti_handle[12]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
                exti_handle[13]->state = gpio_ll_get_input(&exti_handle[13]->gpio);
                exti_handle[13]->cb(exti_handle[13]);
            }
            if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_14) != 0u) {
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_14);
                exti_handle[14]->state = gpio_ll_get_input(&exti_handle[14]->gpio);
                exti_handle[14]->cb(exti_handle[14]);
            }
        }
#endif
#endif // HAL_LL_EXTI
// clang-format on

/* [] END OF FILE */
